/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo3;

import Modelo.Solicitud;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.text.ParseException;
import Acceso.Security;

/**
 *
 * @author glpc
 */
public class registrarSolicitudAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";
    private static final String[] ALLOWED = {"Administrador","Recibir y Atender Solicitudes"};

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        if (!Security.validateSession(request, ALLOWED)) {
            Security.privilegeError(response);
            return mapping.findForward("errorPriv");
        }

        registrarSolicitudForm formBean = (registrarSolicitudForm) form;
        String nombre = formBean.getNombre();
        String telefono = formBean.getTelefono();
        String correo = formBean.getCorreo();
        String fecha_ocurrencia = formBean.getFecha_ocurrencia();
        String status = formBean.getStatus();
        String categoria = formBean.getCategoria();
        String descripcion = formBean.getDescripcion();
        ActionErrors errors = new ActionErrors();
        boolean error = false;
        Pattern p;
        Matcher m;

        // Se verifica si hay campos vacios
        if (nombre == null || nombre.equals("")) {
            errors.add("nombre_sol_requerido", new ActionMessage("errors.nombre_sol_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el nombre sólo tenga caracteres alfabéticos
            p = Pattern.compile("[^a-zA-Z ]+");
            m = p.matcher(nombre);
            if (m.find()) {
                errors.add("nombre_sol_invalido", new ActionMessage("errors.nombre_sol_invalido"));
                saveErrors(request, errors);
                error = true;
            }
        }
        if (telefono == null || telefono.equals("")) {
            errors.add("telefono_sol_requerido", new ActionMessage("errors.telefono_sol_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el teléfono sólo tenga caracteres numéricos
            p = Pattern.compile("[0-9]*");
            m = p.matcher(telefono);
            if (!m.matches()) {
                errors.add("telefono_sol_invalido", new ActionMessage("errors.telefono_sol_invalido"));
                saveErrors(request, errors);
                error = true;
            }
        }
        if (correo == null || correo.equals("")) {
            errors.add("correo_sol_requerido", new ActionMessage("errors.correo_sol_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el correo tenga un formato valido
            p = Pattern.compile("\\w+([._-]\\w+)*@\\w+(\\.[a-zA-Z]{2,4}+)+");
            m = p.matcher(correo);
            if (correo != null && !m.matches()) {
                errors.add("correo_sol_invalido", new ActionMessage("errors.correo_sol_invalido"));
                saveErrors(request, errors);
                error = true;
            }
        }
        if (status == null || status.equals("")) {
            formBean.setError("Debe colocar el estado de la solicitud. Intente Nuevamente");
            return mapping.findForward(FAILURE);
        }
        if (descripcion == null || descripcion.equals("")) {
            errors.add("descripcion_sol_requerido", new ActionMessage("errors.descripcion_sol_requerido"));
            saveErrors(request, errors);
            error = true;
        }
        if (categoria == null || categoria.equals("")) {
            errors.add("categoria_sol_requerido", new ActionMessage("errors.categoria_sol_requerido"));
            saveErrors(request, errors);
            error = true;
        } else if (categoria.equals("Evaluacion de Incidente")) {
            //Si es un incidente, debe tener una fecha.
            if (fecha_ocurrencia == null || fecha_ocurrencia.equals("")) {
                errors.add("fecha_ocurrencia_sol_requerido", new ActionMessage("errors.fecha_ocurrencia_sol_requerido"));
                saveErrors(request, errors);
                error = true;
            } else {
                try {
                    // Se obtiene la fecha actual en el formato del script
                    Calendar c = new GregorianCalendar();
                    String dia, mes, annio;
                    dia = Integer.toString(c.get(Calendar.DATE));
                    mes = Integer.toString(c.get(Calendar.MONTH) + 1);
                    annio = Integer.toString(c.get(Calendar.YEAR));
                    String fechaHoy = dia + "/" + mes + "/" + annio;
                    // Fin de obtener la fecha actual

                    String DATE_FORMAT = "dd/MM/yyyy";
                    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
                    Date c1 = sdf.parse(fechaHoy);
                    Date primera = sdf.parse("01/01/1970");
                    sdf.setLenient(false);
                    Date c2 = sdf.parse(fecha_ocurrencia);

                    if (c2.before(primera)) {
                        errors.add("fecha_ocurrencia_antes_creacion", new ActionMessage("errors.fecha_ocurrencia_antes_creacion"));
                        saveErrors(request, errors);
                        error = true;
                    }

                } catch (ParseException e) {
                    System.out.print("Error procesando la fecha del incidente");
                    errors.add("fecha_ocurrencia_sol_invalido", new ActionMessage("errors.fecha_ocurrencia_sol_invalido"));
                    saveErrors(request, errors);
                    error = true;
                }
            }
        } else {
            fecha_ocurrencia = null;
        }
        if (error) {
            return mapping.findForward(FAILURE);
        }

        Solicitud sol = new Solicitud(telefono, correo, fecha_ocurrencia, nombre, status, categoria, descripcion);

        if (Modelo.DAL.Solicitud_DAO.insertarSolicitud(sol)) {
            return mapping.findForward(SUCCESS);
        } else {
            formBean.setError("Ocurrió un error al insertar en la base de datos...");
            return mapping.findForward(FAILURE);
        }
    }
}
